package com.chhuang.ewcrm.comm;

import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.SerialPort;
import lombok.Data;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;

/**
 * -串口通讯工具类
 * @author Shendi
 *
 */
@Data
public class Serial {
    private String commName;//串口名称,如：COM3 或者 COM4 等
    private int baudRate = 9600;//波特率 默认为9600
    private int dataBits = SerialPort.DATABITS_8;//数据位 默认为8
    private int stopBits = SerialPort.STOPBITS_1;//停止位 默认为1
    private int parity = SerialPort.PARITY_NONE;//奇偶效验 默认为无

    /**
     * 串口通讯工具类构造方法
     * @param commName 串口名称,如：COM3 或者 COM4 等
     * @param serialParameters 波特率 默认为9600, 数据位 默认为8, 停止位 默认为1, 奇偶效验 默认为无
     */
    public Serial(String commName, int... serialParameters){
        this.commName = commName;
        if(serialParameters.length > 0)
            this.baudRate = serialParameters[0];
        if(serialParameters.length > 1)
            this.dataBits = serialParameters[1];
        if(serialParameters.length > 2)
            this.stopBits = serialParameters[2];
        if(serialParameters.length > 3)
            this.parity = serialParameters[3];
    }

    /**
     * -获取通信端口标识符通过端口名
     * @param commName 端口名
     * @return 实例通讯端口标识符
     * @throws NoSuchPortException 找不到串口异常
     */
    public static CommPortIdentifier getCommPortIdentifierByName(String commName) throws NoSuchPortException {
        //如果名称为空 则返回null
        if (commName==null || "".equals(commName)) {
            return null;
        }
        return CommPortIdentifier.getPortIdentifier(commName);
    }

    /**
     * -发送数据
     * @param serialPortOutput 输出流
     * @param bytes 数据
     */
    public static void sendData(OutputStream serialPortOutput, byte[] bytes) {
        //发送数据
        try {
            serialPortOutput.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                serialPortOutput.flush();
                serialPortOutput.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 获取本机可用com口
     * @return
     */
    public static List<String> GetCommNameList() {
        List<String> commNames = new LinkedList<String>();
        Enumeration enumeration = CommPortIdentifier.getPortIdentifiers();
        while (enumeration.hasMoreElements()){
            CommPortIdentifier cpi = (CommPortIdentifier) enumeration.nextElement();
            commNames.add(cpi.getName());
        }
        return commNames;
    }
}

